package com.iuie.ns.system.controller.code;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.iuie.ns.frame.utils.StringUtils;
import com.iuie.ns.frame.utils.beans.UserOperateVO;
import com.iuie.ns.frame.web.dataset.vo.Page;
import com.iuie.ns.frame.web.response.vo.ResponseInfo;
import com.iuie.ns.system.service.code.ISysCodeInfoService;
import com.iuie.ns.system.service.code.ISysCodeTypeService;
import com.iuie.ns.system.vo.code.SysCodeInfoVO;
import com.iuie.ns.system.vo.code.SysCodeTypeVO;

@RequestMapping("sys/code")
@Controller
public class SysCodeInfoController {

	private static final Logger logger = LoggerFactory.getLogger(SysCodeInfoController.class);
	
	@Resource
	private ISysCodeInfoService sysCodeInfoService;
	
	@Resource
	private ISysCodeTypeService sysCodeTypeService;
	
	/**
	 * 码表管理首页
	 * @return
	 * @date 2017年8月27日 下午12:46:47
	 */
	@RequestMapping()
	public String index() {
	    return "view-system/code/code";
	}
	
	/**
	 * 新增码值类型页面
	 * @return
	 * @date 2017年8月27日 下午3:28:56
	 */
	@RequestMapping("codeType/add/index")
    public String codeTypeAddIndex() {
        return "view-system/code/codeTypeAdd";
    }
	
	/**
	 * 修改码值类型页面
	 * @return
	 * @date 2017年8月27日 下午11:21:16
	 */
	@RequestMapping("codeType/update/index/{typeId}")
	public String codeTypeAddIndex(@PathVariable("typeId") String typeId, HttpServletRequest request) {
		request.setAttribute("typeId", typeId);
		return "view-system/code/codeTypeAdd";
	}
	
	/**
	 * 新增码值页面
	 * @param typeId
	 * @param request
	 * @return
	 * @date 2017年8月27日 下午3:32:57
	 */
	@RequestMapping("codeInfo/add/index/{typeId}")
	public String codeInfoAddIndex(@PathVariable("typeId") String typeId, HttpServletRequest request) {
	    request.setAttribute("typeId", typeId);
	    return "view-system/code/codeInfoAdd";
	}
	
	/**
	 * 新增模板码值页面
	 * @param typeId
	 * @param request
	 * @return
	 * @date 2017年8月27日 下午3:32:57
	 */
	@RequestMapping("codeTemplateInfo/add/index/{typeId}")
	public String codeTemplateInfoAddIndex(@PathVariable("typeId") String typeId, HttpServletRequest request) {
	    request.setAttribute("typeId", typeId);
	    return "view-system/code/codeTemplateInfoAdd";
	}
	
	/**
	 * 更新码值页面
	 * @param id
	 * @param request
	 * @return
	 * @date 2017年8月29日 下午9:48:31
	 */
	@RequestMapping("codeInfo/update/index/{id}")
	public String codeInfoUpdateIndex(@PathVariable("id") String id, HttpServletRequest request) {
		request.setAttribute("id", id);
		return "view-system/code/codeInfoAdd";
	}
	
	/**
	 * 修改模板码值页面
	 * @param id
	 * @param request
	 * @return
	 * @date 2018年4月25日上午11:23:53
	 */
	@RequestMapping("codeTemplateInfo/update/index/{id}")
	public String codeTemplateInfoUpdateIndex(@PathVariable("id") String id, HttpServletRequest request) {
		request.setAttribute("id", id);
		return "view-system/code/codeTemplateInfoAdd";
	}
	
	/**
	 * 新增码值-index
	 * @param typeId
	 * @param request
	 * @return
	 * @date 2018年3月17日下午1:37:42
	 */
	@RequestMapping("codeInfo/batch/add/{typeId}/index")
	public String codeInfoBatchAddIndex(@PathVariable("typeId") String typeId, HttpServletRequest request) {
		request.setAttribute("typeId", typeId);
	    return "view-system/code/codeInfoBatchAdd";
	}
	
	/**
	 * 快速新增码表
	 * @return
	 * @date 2018年5月26日下午5:16:07
	 */
	@RequestMapping("quick/add/index")
	public String quickAddIndex() {
		return "view-system/code/quickAdd";
	}
	
	/**
	 * 查看codeText文本
	 * @return
	 * @date 2018年5月29日上午8:37:59
	 */
	@RequestMapping("generate/text/index")
	public String quickCopyIndex() {
		return "view-system/code/quickCopy";
	}
	
	/**
	 * 根据条件分页查询码值类型
	 * @param codeType
	 * @param page
	 * @return
	 * @date 2017年8月27日 下午1:39:56
	 */
	@RequestMapping(value="findCodeTypeByPage")
    @ResponseBody
	public ResponseInfo findCodeTypeByPage(SysCodeTypeVO codeType, Page page) {
	    List<SysCodeTypeVO> list = sysCodeTypeService.findCodeTypeByPage(codeType, page);
	    return ResponseInfo.successInfo(list, page);
	}

	/**
	 * 根据码值类型+条件分页查询码值
	 * @param codeInfo
	 * @param page
	 * @param typeId
	 * @return
	 * @date 2017年8月27日 下午2:19:34
	 */
	@RequestMapping(value="findCodeInfoByPage")
    @ResponseBody
    public ResponseInfo findCodeInfoByPage(SysCodeInfoVO codeInfo, Page page, String typeId) {
	    if (StringUtils.isBlank(typeId)) {
	        return ResponseInfo.successInfo(new ArrayList<>(0), page);
	    }
        List<SysCodeInfoVO> list = sysCodeInfoService.findCodeInfoByCodeTypeAndCondition(codeInfo, page, typeId);
        return ResponseInfo.successInfo(list, page);
    }
	
	/**
	 * 根据类型获取code info
	 * @param codeTypeId
	 * @param state
	 * @return
	 * @date 2017年8月19日 下午3:53:07
	 */
	@RequestMapping(value="findCodeInfoByTypeId")
	@ResponseBody
	public ResponseInfo findCodeInfoByTypeId(@RequestParam("codeTypeId") String codeTypeId, Integer state){
		List<SysCodeInfoVO> codeInfo = sysCodeInfoService.findByCodeTypeId(codeTypeId, state);
		logger.info("查询到codeTypeId={}的所有codeInfo：{}", codeTypeId,codeInfo);
		return ResponseInfo.successInfo(codeInfo);
	}
	
	/**
	 * 删除码值类型
	 * @param typeId
	 * @return
	 * @date 2017年8月27日 下午4:02:31
	 */
	@RequestMapping(value="removeCodeTypeById/{typeId}", method=RequestMethod.POST)
    @ResponseBody
    public ResponseInfo removeCodeTypeById(@PathVariable("typeId") String typeId) {
	    sysCodeTypeService.removeCodeTypeById(typeId);
	    return ResponseInfo.successInfo("码值类型删除成功！");
	}
	
	/**
	 * 根据ID删除码值
	 * @param id
	 * @return
	 * @date 2017年8月27日 下午9:42:06
	 */
	@RequestMapping(value="removeCodeInfoById/{id}", method=RequestMethod.POST)
    @ResponseBody
    public ResponseInfo removeCodeInfoById(@PathVariable("id") String id) {
		sysCodeInfoService.removeCodeInfoById(id);
		return ResponseInfo.successInfo("码值删除成功！");
	}
	
	/**
	 * 删除code info
	 * @param codeInfoValue
	 * @return
	 * @date 2017年8月19日 下午3:53:20
	 */
	@RequestMapping(value="deleteCodeByCodeValue", method=RequestMethod.POST)
	@ResponseBody
	public ResponseInfo deleteCodeByCodeValue(@RequestParam("codeInfoValue") String codeInfoValue){
		sysCodeInfoService.deleteById(codeInfoValue);
		logger.info("删除codeValue={}的码值成功", codeInfoValue);
		return ResponseInfo.successInfo("删除成功！");
	}
	
	/**
	 * 新增或修改code info
	 * @param codeInfo 码值
	 * @return
	 * @date 2017年8月19日 下午3:52:35
	 */
	@RequestMapping(value="editCodeInfo", method=RequestMethod.POST)
	@ResponseBody
	public ResponseInfo editCodeInfo(SysCodeInfoVO codeInfo){
		sysCodeInfoService.editCodeInfo(codeInfo);
		logger.info("添加或修改codeInfo={}的码值成功",codeInfo);
		return ResponseInfo.successInfo("添加或修改码值成功");
	}
	
	/**
	 * 根据code value(id)获取code info
	 * @param codeValue codeInfoValue，码值ID
	 * @return
	 * @date 2017年8月19日 下午3:52:46
	 */
	@RequestMapping(value="find/codeInfo/{id}")
	@ResponseBody
	public ResponseInfo findCodeInfoById(@PathVariable("id") String id){
		SysCodeInfoVO codeInfo = sysCodeInfoService.findCodeInfoById(id);
		logger.info("查询到codeInfo：{}",id,codeInfo);
		return ResponseInfo.successInfo(codeInfo);
	}
	
	@RequestMapping(value="find/codeType/{typeId}")
    @ResponseBody
	public ResponseInfo findCodeTypeById(@PathVariable("typeId") String typeId) throws Exception {
	    SysCodeTypeVO codeType = sysCodeTypeService.findCodeTypeById(typeId);
        return ResponseInfo.successInfo(codeType);
	}
	
	/**
	 * 保存树形结构码值，ext1作为pid
	 * @param oper
	 * @param codeTypeId
	 * @return
	 * @throws Exception 
	 * @date 2017年8月19日 下午3:44:24
	 */
	@RequestMapping(value="save/treeCode/{codeTypeId}")
    @ResponseBody
	public ResponseInfo editTreeCodeInfo(@RequestBody UserOperateVO oper, @PathVariable("codeTypeId") String codeTypeId) throws Exception {
	    sysCodeInfoService.saveTreeCodeInfo(oper, codeTypeId);
        return ResponseInfo.successInfo("保存成功！");
	}
	
	/**
	 * 保存码值类型（新增/修改）
	 * @param codeType
	 * @return
	 * @date 2017年8月27日 下午10:32:56
	 */
	@RequestMapping(value="save/codeType", method=RequestMethod.POST)
    @ResponseBody
    public ResponseInfo saveCodeType(SysCodeTypeVO codeType) {
		sysCodeTypeService.saveCodeType(codeType);
		return ResponseInfo.successInfo("保存码值类型成功！");
	}
	
	/**
	 * 保存一条码值
	 * @param codeInfo
	 * @return
	 * @date 2017年8月28日 上午8:35:33
	 */
	@RequestMapping(value="save/codeInfo", method=RequestMethod.POST)
    @ResponseBody
    public ResponseInfo saveCodeInfo(SysCodeInfoVO codeInfo) {
		sysCodeInfoService.saveCodeInfo(codeInfo);
		return ResponseInfo.successInfo("保存成功，码值：" + codeInfo.getCodeInfoName() + "！");
	}
	
	
	/**
	 * 批量新增码值
	 * @param text
	 * @param rule
	 * @param typeId
	 * @return
	 * @date 2018年3月17日下午1:46:24
	 */
	@RequestMapping(value="codeInfo/batch/add/{typeId}", method=RequestMethod.POST)
    @ResponseBody
    public ResponseInfo batchSaveCodeInfo(String text, String rule, @PathVariable("typeId") String typeId) {
		sysCodeInfoService.batchSaveCodeInfo(text, rule, typeId);
		return ResponseInfo.successInfo("批量新增码值成功！");
	}
	
	/**
	 * 快速新增
	 * @param text
	 * @return
	 * @date 2018年5月26日下午5:29:19
	 */
	@RequestMapping(value="quick/add", method=RequestMethod.POST)
	@ResponseBody
	public ResponseInfo quickAdd(String text){
		String describe = sysCodeInfoService.batchQuickAdd(text);
		return ResponseInfo.successInfo("快速新增码表成功，新增情况：" + describe + "！");
	}
	
	/**
	 * 生成文本
	 * @param types
	 * @return
	 * @date 2018年5月28日下午9:35:42
	 */
	@RequestMapping(value="generate/text", method=RequestMethod.POST)
	@ResponseBody
	public ResponseInfo generateBuilderText(@RequestParam(value="types[]", required=false) String[] types) {
		String text = sysCodeTypeService.generateBuilderText(types);
		return ResponseInfo.successInfoByObject(text);
	}
	
}
